home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- * colour.c
- *
- * This module implements routines to manipulate colours.
- *
- * from Persistence of Vision Raytracer
- * Copyright 1993 Persistence of Vision Team
- *---------------------------------------------------------------------------
- * NOTICE: This source code file is provided so that users may experiment
- * with enhancements to POV-Ray and to port the software to platforms other
- * than those supported by the POV-Ray Team. There are strict rules under
- * which you are permitted to use this file. The rules are in the file
- * named POVLEGAL.DOC which should be distributed with this file. If
- * POVLEGAL.DOC is not available or for more info please contact the POV-Ray
- * Team Coordinator by leaving a message in CompuServe's Graphics Developer's
- * Forum. The latest version of POV-Ray may be found there as well.
- *
- * This program is based on the popular DKB raytracer version 2.12.
- * DKBTrace was originally written by David K. Buck.
- * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins.
- *
- *****************************************************************************/
-
- #include "frame.h"
- #include "vector.h"
- #include "povproto.h"
-
- #define FABS(x) ((x) < 0.0 ? (0.0 - (x)) : (x))
-
- COLOUR_MAP_ENTRY *Build_Entries;
-
- COLOUR *Create_Colour ()
- {
- COLOUR *New;
-
- if ((New = (COLOUR *) malloc (sizeof (COLOUR))) == NULL)
- MAError ("color");
-
- Make_Colour (New, 0.0, 0.0, 0.0);
- return (New);
- }
-
- COLOUR *Copy_Colour (Old)
- COLOUR *Old;
- {
- COLOUR *New;
- if (Old != NULL)
- {
- New = Create_Colour ();
- *New = *Old;
- }
- else New = NULL;
- return (New);
- }
-
- COLOUR_MAP_ENTRY *Create_CMap_Entries (Map_Size)
- int Map_Size;
- {
- COLOUR_MAP_ENTRY *New;
-
- if ((New = (COLOUR_MAP_ENTRY *)
- malloc(Map_Size * sizeof (COLOUR_MAP_ENTRY))) == NULL)
- MAError ("colour map entry");
- return (New);
- }
-
- COLOUR_MAP_ENTRY *Copy_CMap_Entries (Old,Map_Size)
- COLOUR_MAP_ENTRY *Old;
- int Map_Size;
- {
- COLOUR_MAP_ENTRY *New;
- register int i;
-
- if (Old != NULL)
- {
- New = Create_CMap_Entries (Map_Size);
- for (i = 0; i < Map_Size; i++)
- New[i] = Old[i];
- }
- else
- New = NULL;
- return (New);
- }
-
- COLOUR_MAP *Create_Colour_Map ()
- {
- COLOUR_MAP *New;
-
- if ((New = (COLOUR_MAP *) malloc (sizeof (COLOUR_MAP))) == NULL)
- MAError ("colour map");
-
- New->Users = 0;
- New->Number_Of_Entries = 0;
- New->Colour_Map_Entries = NULL;
- New->Transparency_Flag = FALSE;
- return (New);
- }
-
- COLOUR_MAP *Copy_Colour_Map (Old)
- COLOUR_MAP *Old;
- {
- COLOUR_MAP *New;
-
- New = Old;
- if (New != NULL)
- New->Users++;
-
- return (New);
- }
-
- DBL Colour_Distance (colour1, colour2)
- COLOUR *colour1, *colour2;
- {
- return (FABS (colour1->Red - colour2->Red)
- + FABS (colour1->Green - colour2->Green)
- + FABS (colour1->Blue - colour2->Blue));
- }
-
- void Add_Colour (result, colour1, colour2)
- COLOUR *result, *colour1, *colour2;
- {
- result->Red = colour1->Red + colour2->Red;
- result->Green = colour1->Green + colour2->Green;
- result->Blue = colour1->Blue + colour2->Blue;
- result->Filter = colour1->Filter + colour2->Filter;
- }
-
- void Scale_Colour (result, colour, factor)
- COLOUR *result, *colour;
- DBL factor;
- {
- result->Red = colour->Red * factor;
- result->Green = colour->Green * factor;
- result->Blue = colour->Blue * factor;
- result->Filter = colour->Filter * factor;
- }
-
- void Clip_Colour (result, colour)
- COLOUR *result, *colour;
- {
- if (colour -> Red > 1.0)
- result -> Red = 1.0;
- else if (colour -> Red < 0.0)
- result -> Red = 0.0;
- else result -> Red = colour -> Red;
-
- if (colour -> Green > 1.0)
- result -> Green = 1.0;
- else if (colour -> Green < 0.0)
- result -> Green = 0.0;
- else result -> Green = colour -> Green;
-
- if (colour -> Blue > 1.0)
- result -> Blue = 1.0;
- else if (colour -> Blue < 0.0)
- result -> Blue = 0.0;
- else result -> Blue = colour -> Blue;
-
- if (colour -> Filter > 1.0)
- result -> Filter = 1.0;
- else if (colour -> Filter < 0.0)
- result -> Filter = 0.0;
- else result -> Filter = colour -> Filter;
- }
-
- void Destroy_Colour_Map (CMap)
- COLOUR_MAP *CMap;
- {
- if (CMap == NULL)
- return;
-
- if (CMap->Users < 0)
- return;
-
- CMap->Users--;
-
- if (CMap->Users >= 0)
- return;
-
- free (CMap->Colour_Map_Entries);
- free (CMap);
- }
-